/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cursoexperto.jftf.jsf.pack;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.el.ELContext;
import javax.faces.context.FacesContext;
import org.cursoexperto.jftf.controller.VentaJpaController;
import org.cursoexperto.jftf.entidades.Producto;
import org.cursoexperto.jftf.entidades.Venta;
import org.cursoexperto.jftf.entidades.LineaVenta;

/**
 *
 * @author Jose Fernando
 */
public class CarritoController {

    public CarritoController() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        importeTotalBig = new BigDecimal(BigInteger.ZERO);
        jpaController = (VentaJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "ventaJpa");
    }
    private Producto producto = null;
    private Venta carrito = null;
    private BigDecimal importeTotalBig;
    private VentaJpaController jpaController;

    public Producto getProducto() {
        if (producto == null) {
            producto = new Producto();
        }
        return producto;
    }

    /**
     * Crea la venta con el contenido del carrito de la compra
     */
    public void create() {
        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            carrito.setCliente(((ClienteController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "cliente")).getCliente());
            Calendar gc = new GregorianCalendar();
            carrito.setFecha(gc.getTime());
            jpaController.create(carrito);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * Añade una cantidad de un producto que se le pasa como parametro desde el formulario al
     * carrito de la compra que se guarda en sesion
     * @return Devuelve la redireccion
     */
    public String anadeProducto() {
        Producto p;
        if (getCarrito() == null) {
            setCarrito(new Venta());
        }
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        p = (Producto) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "item");
        return anadeProductoALista(p, p.getCantidadAAnadir());
    }

    /**
     * Elimina una cantidad de un producto que se le pasa como parametro desde el formulario al
     * carrito de la compra que se guarda en sesion
     * @return Devuelve la redireccion
     */
    public String eliminaProducto() {
        Producto p;
        if (getCarrito() == null) {
            setCarrito(new Venta());
        }
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        p = (Producto) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "item");
        return eliminaProductoLista(p, p.getCantidadAAnadir());
    }

    private String anadeProductoALista(Producto p, int cantidad) {
        for (LineaVenta pSel : carrito.getCarroCompra()) {
            if (pSel.getProducto().equals(p)) {
                pSel.setCantidad(pSel.getCantidad() + cantidad);
                calculaImporteTotal();
                p.setCantidadAAnadir(1);
                return "producto_listado";
            }
        }
        carrito.getCarroCompra().add(new LineaVenta(p, cantidad));
        calculaImporteTotal();
        p.setCantidadAAnadir(1);
        return "producto_listado";
    }

    private String eliminaProductoLista(Producto p, int cantidad) {
        LineaVenta pSelAux = null;
        for (LineaVenta pSel : carrito.getCarroCompra()) {
            if (pSel.getProducto().equals(p)) {
                if (pSel.getCantidad() <= cantidad) {
                    pSelAux = pSel;
                } else {
                    pSel.setCantidad(pSel.getCantidad() - cantidad);
                }
            }
        }
        if (pSelAux != null) {
            carrito.getCarroCompra().remove(pSelAux);
        }
        calculaImporteTotal();
        p.setCantidadAAnadir(1);
        return "producto_listado";
    }

    /**
     * Añade una cantidad de un producto que se le pasa como parametro desde el formulario al
     * carrito de la compra que se guarda en sesion
     * @return Devuelve la redireccion
     */
    public String anadeProductoBus() {
        Producto p;
        if (getCarrito() == null) {
            setCarrito(new Venta());
        }
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        p = (Producto) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "item");
        return anadeProductoAListaBus(p, p.getCantidadAAnadir());
    }

    /**
     * Elimina una cantidad de un producto que se le pasa como parametro desde el formulario al
     * carrito de la compra que se guarda en sesion
     * @return Devuelve la redireccion
     */
    public String eliminaProductoBus() {
        Producto p;
        if (getCarrito() == null) {
            setCarrito(new Venta());
        }
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        p = (Producto) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "item");
        return eliminaProductoListaBus(p, p.getCantidadAAnadir());
    }

    private String anadeProductoAListaBus(Producto p, int cantidad) {
        for (LineaVenta pSel : carrito.getCarroCompra()) {
            if (pSel.getProducto().equals(p)) {
                pSel.setCantidad(pSel.getCantidad() + cantidad);
                calculaImporteTotal();
                p.setCantidadAAnadir(1);
                return "producto_listado_bus";
            }
        }
        carrito.getCarroCompra().add(new LineaVenta(p, cantidad));
        calculaImporteTotal();
        p.setCantidadAAnadir(1);
        return "producto_listado_bus";
    }
    
    private String eliminaProductoListaBus(Producto p, int cantidad) {
        LineaVenta pSelAux = null;
        for (LineaVenta pSel : carrito.getCarroCompra()) {
            if (pSel.getProducto().equals(p)) {
                if (pSel.getCantidad() <= cantidad) {
                    pSelAux = pSel;
                } else {
                    pSel.setCantidad(pSel.getCantidad() - cantidad);
                }
            }
        }
        if (pSelAux != null) {
            carrito.getCarroCompra().remove(pSelAux);
        }
        calculaImporteTotal();
        p.setCantidadAAnadir(1);
        return "producto_listado_bus";
    }

    /**
     * Añade una cantidad de un producto que se le pasa como parametro desde el formulario al
     * carrito de la compra que se guarda en sesion
     * @return Devuelve la redireccion
     */
    public String anadeProductoCarr() {
        LineaVenta p;
        if (getCarrito() == null) {
            setCarrito(new Venta());
        }
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        p = (LineaVenta) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "item");
        return anadeProductoAListaCarr(p.getProducto(), p.getProducto().getCantidadAAnadir());
    }

    /**
     * Elimina una cantidad de un producto que se le pasa como parametro desde el formulario al
     * carrito de la compra que se guarda en sesion
     * @return Devuelve la redireccion
     */
    public String eliminaProductoCarr() {
        LineaVenta p;
        if (getCarrito() == null) {
            setCarrito(new Venta());
        }
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        p = (LineaVenta) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "item");
        return eliminaProductoListaCarr(p.getProducto(), p.getProducto().getCantidadAAnadir());
    }

    private String anadeProductoAListaCarr(Producto p, int cantidad) {
        for (LineaVenta pSel : carrito.getCarroCompra()) {
            if (pSel.getProducto().equals(p)) {
                pSel.setCantidad(pSel.getCantidad() + cantidad);
                calculaImporteTotal();
                p.setCantidadAAnadir(1);
                return "producto_listado_carr";
            }
        }
        carrito.getCarroCompra().add(new LineaVenta(p, cantidad));
        calculaImporteTotal();
        p.setCantidadAAnadir(1);
        return "producto_listado_carr";
    }

    private String eliminaProductoListaCarr(Producto p, int cantidad) {
        LineaVenta pSelAux = null;
        for (LineaVenta pSel : carrito.getCarroCompra()) {
            if (pSel.getProducto().equals(p)) {
                if (pSel.getCantidad() <= cantidad) {
                    pSelAux = pSel;
                } else {
                    pSel.setCantidad(pSel.getCantidad() - cantidad);
                }
            }
        }
        if (pSelAux != null) {
            carrito.getCarroCompra().remove(pSelAux);
        }
        calculaImporteTotal();
        p.setCantidadAAnadir(1);
        return "producto_listado_carr";
    }

    /**
     * Calcula el importe total del contenido del carrito de la compra y lo almacena
     * en el bean
     */
    public void calculaImporteTotal() {
        BigDecimal importeAuxBig = new BigDecimal(0);
        for (LineaVenta p : carrito.getCarroCompra()) {
            importeAuxBig = importeAuxBig.add(p.getProducto().getPrecio().multiply(new BigDecimal(p.getCantidad())));
        }
        importeTotalBig = importeAuxBig;
    }

    /**
     * @return the carrito
     */
    public Venta getCarrito() {
        return carrito;
    }

    /**
     * @param carrito the carrito to set
     */
    public void setCarrito(Venta carrito) {
        this.carrito = carrito;
    }

    /**
     * @return the importeTotal
     */
    public BigDecimal getImporteTotal() {
        return importeTotalBig;
    }

    /**
     * @param importeTotal the importeTotal to set
     */
    public void setImporteTotal(BigDecimal importeTotal) {
        this.importeTotalBig = importeTotal;
    }

    void resetCarrito() {
        setCarrito(null);
        setImporteTotal(new BigDecimal(BigInteger.ZERO));
    }

    public String comprar() {
        create();
        resetCarrito();
        return "compraRealizada";
    }
}
